﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuanLyKhachSan.Validation;
using DataAccess;
using System.Linq.Expressions;

namespace QuanLyKhachSan
{
    public class HoaDonThuePhongManager:IValidator<HoaDonThuePhong>,ILenhThucThi<HoaDonThuePhong>
    {
        public ValidateResult Validate(HoaDonThuePhong obj)
        {
            var vResult = new ValidateResult();
            if (obj.HoTenNguoiDat.Trim()=="")
            {
                vResult.Message.Add("Chưa nhập họ tên người đặt phòng");
            }
            if (obj.MaNV <= 0)
            {
                vResult.Message.Add("Chưa nhập mã nhân viên lập hóa đơn");
            }
            if (obj.TienDatCoc <= 0)
            {
                vResult.Message.Add("Số tiền đặt cọc phải lớn hơn 0");
            }
            if (obj.TrangThai.Trim() == "")
            {
                vResult.Message.Add("Chưa nhập trạng thái hóa đơn thuê phòng");
            }
            if (obj.NgayDenDuKien == null)
            {
                vResult.Message.Add("Chưa nhập ngày đến dự kiến");
            }
            if (obj.NgayLapHD == null)
            {
                vResult.Message.Add("Chưa nhập ngày lập hóa đơn");
            }
            if (obj.NgayDi > DateTime.Now)
            {
                vResult.Message.Add("Ngày đi nhập vào vượt quá ngày hiện hành");
            }
            if (obj.NgayDen > DateTime.Now)
            {
                vResult.Message.Add("Ngày đến nhập vào vượt quá ngày hiện hành");
            }
            if (obj.NgayLapHD > DateTime.Now)
            {
                vResult.Message.Add("Ngày lập hóa đơn nhập vào vượt quá ngày hiện hành");
            }
            if (obj.NgayDi <= obj.NgayDen)
            {
                vResult.Message.Add("Ngày đi phải sau ngày đến ít nhất 1 ngày");
            }
            return vResult;
        }
        public ActionResult Them(HoaDonThuePhong obj)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                try
                {
                    context.HoaDonThuePhongs.Add(obj);
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
            }
            return aResult;
        }

        public ActionResult Xoa(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                try
                {
                    var query = (from hdtp in context.HoaDonThuePhongs
                                 where hdtp.MaHD+"" == ma
                                 select hdtp).FirstOrDefault();
                    foreach (var ex in KiemTraRangBuoc(ma).Exceptions)
                    {
                        aResult.Exceptions.Add(ex);
                    }
                    if (KiemTraRangBuoc(ma).Exceptions.Count == 0)
                    {
                        context.HoaDonThuePhongs.Remove(query);
                        context.SaveChanges();
                    }
                    else
                    {
                        query.TrangThai = "Đã xóa";
                        context.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
            }
            return aResult;
        }

        public ActionResult CapNhat(HoaDonThuePhong obj)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var query = (from hdtp in context.HoaDonThuePhongs
                            where hdtp.MaHD == obj.MaHD
                            select hdtp).FirstOrDefault();
                try
                {
                    query.NgayLapHD = obj.NgayLapHD;
                    query.NgayDenDuKien = obj.NgayDenDuKien;
                    query.NgayDen = obj.NgayDen;
                    query.NgayDi = obj.NgayDi;
                    query.TienDatCoc = obj.TienDatCoc;
                    query.TongTienThuePhong = obj.TongTienThuePhong;
                    query.TrangThai = obj.TrangThai;

                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    aResult.Exceptions.Add(ex);
                }
            }
            return aResult;
        }

        public ActionResultAsList<HoaDonThuePhong> LayDanhSach()
        {
            ActionResultAsList<HoaDonThuePhong> aResult = new ActionResultAsList<HoaDonThuePhong>();
            QLKhachSanContext context = new QLKhachSanContext();
            var query = from hdtp in context.HoaDonThuePhongs
                        where hdtp.TrangThai!="Đã xóa"
                        select hdtp;
            if (!query.Any())
            {
                aResult.Exceptions.Add(new Exception("Không tìm thấy hóa đơn thuê phòng nào"));
            }
            aResult.Result = query.ToList();
            return aResult;
        }

        public ActionResultAsList<HoaDonThuePhong> TimHoaDonTheoDK(Expression<Func<HoaDonThuePhong,bool>> predicate)
        {
            ActionResultAsList<HoaDonThuePhong> aResult = new ActionResultAsList<HoaDonThuePhong>();
            QLKhachSanContext context = new QLKhachSanContext();
            var query = (from hdtp in context.HoaDonThuePhongs
                         where hdtp.TrangThai != "Đã xóa"
                         select hdtp).Where(predicate);
            if (!query.Any())
            {
                aResult.Exceptions.Add(new Exception("Không tìm thấy hóa đơn thuê phòng nào thỏa điều kiện"));
            }
            aResult.Result = query.ToList();
            return aResult;
        }

        private ActionResult KiemTraRangBuoc(string ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var query = from cthdtp in context.ChiTietHoaDonThuePhongs
                            where cthdtp.MaHD+"" == ma
                            select cthdtp;
                if (query.Any())
                {
                    aResult.Exceptions.Add(new Exception("Tồn tại ràng buộc trên bảng chi tiết hóa đơn"));
                }
            }
            return aResult;
        }


        public ActionResult Xoa(HoaDonThuePhong ma)
        {
            throw new NotImplementedException();
            
            
        }
    }
}
